La mortalidad prenatal se refiere a aquellos bebés que fallecen pasadas las 28 semanas de embarazo (a partir del séptimo mes) y que no llegan a término. Las pricipales causas son las complicaciones que surgen durante el embarazo ya sean por infecciones como sífilis o VIH, otros tipos de anomalías maternas, como diabetes o hipertensión o hábitos perjudiciales como el consumo de tabaco o el alcohol.
Además de estos factores, las condiciones ambientales pueden tener un efecto negativo en el embarazo. Estudios sugieren que la presencia de contaminantes en el aire pueden causar complicaciones en el embarazo e incluso aumentar la probabilidad de partos prematuros, así como la exposición al ruido puede tener efectos adversos para el embarazo pudiendo llegar a afectar a la mortalidad prenatal.
En este seminario, vamos a tratar de demostrar si estos estudios se cumplen en las distintas comunidades autónomas españolas, analizando la relación que hay entre la calidad del aire y la contaminación acústica con la mortalidad prenatal.
El objetivo principal es demostrar si la contaminación del aire y la exposición al ruido pueden estar asociados con el número de casos de mortalidad fetal, a través de:
Los datos que vamos a utilizar han sido encontrados en la página
oficial del Instituto Nacional de Estadística (INE) en el que se pueden
encontrar una gran cantidad de datos de diferentes formatos como XLS,
csv, JSON … En nuestro caso los datos sobre mortalidad prenatal y
contaminación son de fromato csv y JSON y se encuentran en la carpeta
DATA dentro de la carpeta Input del
repositorio.
Para poder utilizar estos conjuntos de datos son necesarios importarlos, para ello utilizaremos las siguientes librerías:
# Datos con formato .csv:
library(readr)
#Datos con formato .json:
library(tidyverse)
library(rjson)
library(tidyjson)
#Visualizacion resultados:
library(DT)
library(ggplot2)
library(gifski)
library(ggplot2)
library(gganimate)
Una vez cargadas las librerías se pueden importar los datos.
En algunos de nuestros archivos csv, es necesario especificar el tipo de codificación que tienen, para que R pueda leer correctamente los caracteres especiales como tildes o ñ. En nuestro caso utilizan la codificacion ISO 8859-1 que corresponde con el alfabeto español :
# Para conocer el tipo de codificación:
encoding <- guess_encoding("Input/DATA/media_anual_PM2_5.csv")
print(encoding)
## # A tibble: 2 × 2
## encoding confidence
## <chr> <dbl>
## 1 ISO-8859-1 0.58
## 2 ISO-8859-2 0.25
PM2_media <- read_delim("Input/DATA/media_anual_PM2_5.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE,
locale = locale(encoding = "ISO-8859-1"))
PM10_media <- read_delim("Input/DATA/media_anual_PM10.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE,
locale = locale(encoding = "ISO-8859-1"))
RUIDO_media <- read_delim("Input/DATA/poblacion_sufre_ruidos.csv",
delim = ";", escape_double = FALSE, trim_ws = TRUE)
Los datos en los archivos csv estan distribuidos de tal forma que puede dificultar su comprensión y manejo, por ello vamos a modificarlos y ordenarlos.
El objetivo es conseguir que los años (periodo), que de forma predeterminada vienen en una única columna pasen a ser las columnas del dataframe y el nombre de las comunidades autónomas las filas. Además, eliminar aquellas columnas y filas que no son de nuestro interés.
# Datos concentración anual PM 2.5
PM2_ccaa_media <- PM2_media %>%
pivot_wider(names_from = periodo, values_from = Total)%>%
select(-`Total Nacional`)%>% #Eliminar columna Total Nacional
slice(-1)%>% #Eliminar fila Total Nacional
pivot_longer(
cols = c("2022":"2004"),names_to = "Año",values_to = "PM2_5"
)
datatable(PM2_ccaa_media)
# Datos concentración anual PM 10
PM10_CCAA_media <- PM10_media %>%
pivot_wider(names_from = periodo, values_from = Total)%>%
select(-`Total Nacional`)%>%
slice(-1)%>%
pivot_longer(names_to = "Año", values_to = "PM10", cols = c("2022":"2004"))
datatable(PM10_CCAA_media)
#Datos población afectada por ruidos
RUIDO_CCAA_media <- RUIDO_media %>%
pivot_wider(names_from = periodo, values_from = Total)%>%
select(-`Total Nacional`)%>%
slice(-1) %>%
pivot_longer(names_to = "Año", values_to = "Ruido", cols = c("2020":"2004"))
El nombre de las Comunidades Autónomas en los archivos csv aparecen con un índice que en nuestro caso vamos a eliminar ya que no lo utilizaremos y nos dificulta el tratamiento de las tablas.
(En las tablas referentes a contaminación, se cambiará más adelante)
En el caso del ruido:
RUIDO_CCAA <-
RUIDO_CCAA_media %>%
mutate(Comunidades_Autonomas = case_when(
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "01 Andalucía" ~ "Andalucía",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "02 Aragón" ~ "Aragón",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "03 Asturias, Principado de" ~ "Asturias, Principado de",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "04 Balears, Illes" ~ "Balears, Illes",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "05 Canarias" ~ "Canarias",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "06 Cantabria" ~ "Cantabria",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "07 Castilla y León" ~ "Castilla y León",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "08 Castilla - La Mancha" ~ "Castilla - La Mancha",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "09 Cataluña" ~ "Cataluña",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "10 Comunitat Valenciana" ~ "Comunitat Valenciana",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "11 Extremadura" ~ "Extremadura",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "12 Galicia" ~ "Galicia",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "13 Madrid, Comunidad de" ~ "Madrid, Comunidad de",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "14 Murcia, Región de" ~ "Murcia, Región de",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "15 Navarra, Comunidad Foral de" ~ "Navarra, Comunidad Foral de",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "16 País Vasco" ~ "País Vasco",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "17 Rioja, La" ~ "Rioja, La",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "18 Ceuta" ~ "Ceuta",
RUIDO_CCAA_media$`Comunidades y Ciudades Autónomas`== "19 Melilla" ~ "Melilla",
))%>%
select(Comunidades_Autonomas, everything())%>%
select(-`Comunidades y Ciudades Autónomas`)
datatable(RUIDO_CCAA)
mort_prenatal <- fromJSON(file = "INPUT/DATA/mortalidad_prenatal_total.json")
mort_prenatal %>%
spread_all()
## # A tbl_json: 60 x 6 tibble with a "JSON" attribute
## ..JSON document.id COD Nombre T3_Unidad T3_Escala
## <chr> <int> <chr> <chr> <chr> <chr>
## 1 "{\"COD\":\"IDB8311..." 1 IDB83113 Total Nacio… Defuncio… " "
## 2 "{\"COD\":\"IDB8311..." 2 IDB83112 Total Nacio… Defuncio… " "
## 3 "{\"COD\":\"IDB8311..." 3 IDB83111 Total Nacio… Defuncio… " "
## 4 "{\"COD\":\"IDB8317..." 4 IDB83170 Andalucía, … Defuncio… " "
## 5 "{\"COD\":\"IDB8316..." 5 IDB83169 Andalucía, … Defuncio… " "
## 6 "{\"COD\":\"IDB8316..." 6 IDB83168 Andalucía, … Defuncio… " "
## 7 "{\"COD\":\"IDB8316..." 7 IDB83167 Aragón, Mor… Defuncio… " "
## 8 "{\"COD\":\"IDB8316..." 8 IDB83166 Aragón, Mor… Defuncio… " "
## 9 "{\"COD\":\"IDB8316..." 9 IDB83165 Aragón, Mor… Defuncio… " "
## 10 "{\"COD\":\"IDB8316..." 10 IDB83164 Asturias, P… Defuncio… " "
## # ℹ 50 more rows
Una vez que hemos importado el archivo json, analizamos los tipos de los atributos que lo forman para quedarnos con aquellos de tipo array que son los que contienen la información que queremos:
mort_prenatal %>%
gather_object %>%
json_types %>%
count(name, type)
## # A tibble: 6 × 3
## name type n
## <chr> <fct> <int>
## 1 COD string 60
## 2 Data array 60
## 3 MetaData array 60
## 4 Nombre string 60
## 5 T3_Escala string 60
## 6 T3_Unidad string 60
En nuestro caso queremos estudiar la mortalidad prenatal tanto en hombres como en mujeres, para ello filtramos eliminando las columnas de hombres y mujeres quedándonos con las de ambos sexos:
filter <- c()
for (i in 1:60){
filter <- append(filter, mort_prenatal[[i]]$MetaData[[4]]$Nombre == "Ambos sexos")
}
elim = 0
for (i in 1:60){
if(!filter[i]){
mort_prenatal[[i-elim]] <- NULL
elim <- elim + 1
}
}
Analizamos en profundidad el contenido de cada array y obtenemos lo siguiente:
#VALORES DE LOS AÑOS A PARTIR DE 2004 Y VALORES MORTALIDAD
mort_valores_prenatal <-
mort_prenatal %>%
enter_object(Data) %>%
gather_array %>%
spread_all %>%
select(Anyo, Valor, document.id)%>%
filter(Anyo >=2004)
mort2_CCAA_prenatal <- mort_prenatal %>%
enter_object(MetaData) %>%
gather_array %>%
spread_all %>%
select(Nombre, document.id, T3_Variable) %>%
filter(Nombre == "Andalucía" | Nombre == "Aragón" | Nombre == "Asturias, Principado de" |
Nombre == "Balears, Illes" | Nombre == "Canarias" | Nombre == "Cantabria" |
Nombre == "Castilla y León" | Nombre == "Castilla - La Mancha" | Nombre == "Cataluña" |
Nombre == "Comunitat Valenciana" | Nombre == "Extremadura" | Nombre == "Galicia" |
Nombre == "Madrid, Comunidad de" | Nombre == "Murcia, Región de" | Nombre == "Navarra, Comunidad Foral de" |
Nombre == "País Vasco" | Nombre == "Rioja, La" | Nombre == "Ceuta" | Nombre == "Melilla")
Para obtener la tabla con todos los datos bien estructurados y organizados es necesario hacer join entre los datos de ambos arrays:
#Join:
JOIN_mort_prenatal <-
mort_valores_prenatal %>%
select(c("Anyo", "Valor", "document.id")) %>%
full_join(x = .,
y = mort2_CCAA_prenatal %>%
select(c("Nombre", "document.id")),
by = c("document.id") )
mortalidad <- JOIN_mort_prenatal %>%
select(Nombre, Anyo, Valor)%>%
pivot_wider(names_from = Anyo, values_from = Valor)%>% #Hacer que filas = CCAA y columnas = años
slice(-1)%>%#Eliminar datos Total Nacional
pivot_longer(names_to = "Año", values_to = "Mortalidad", cols = c("2022":"2004"))%>%
rename(Comunidades_Autonomas = "Nombre")
datatable(mortalidad)
A continuación relacionaremos las dos tablas de contaminación, obteniendo un valor medio entre estas PM2.5 y PM10, para posteriormente hacer una unión con la mortalidad.
# Limpiar los datos, eliminando valores no numéricos o incorrectos
# Reemplazar comas por puntos decimales y convertir a numérico
PM2_ccaa_media <- PM2_ccaa_media %>%
mutate(PM2_5 = as.numeric(gsub(",", ".", as.character(PM2_5))))
PM10_CCAA_media <- PM10_CCAA_media %>%
mutate(PM10 = as.numeric(gsub(",", ".", as.character(PM10))))
# Unir las tablas por "Comunidades y Ciudades Autónomas" y "año"
calidad_aire <- PM2_ccaa_media %>%
inner_join(PM10_CCAA_media, by = c("Comunidades y Ciudades Autónomas", "Año"))
# Calcular la media para cada comunidad y año, ignorando los valores NA
tabla_aire <- calidad_aire %>%
mutate(media_PM = rowMeans(select(., PM2_5, PM10), na.rm = TRUE)) %>% # Calcular media entre PM2.5 y PM10
group_by(`Comunidades y Ciudades Autónomas`, Año) %>%
summarize(media_PM = mean(media_PM, na.rm = TRUE), .groups = "drop") # Media por grupo ignorando NA
Cambio de nombre de atributo Comunidades y Ciudades Autónomas
media_calidad_aire <-
tabla_aire %>%
mutate(Comunidades_Autonomas = case_when(
tabla_aire$`Comunidades y Ciudades Autónomas`== "01 Andalucía" ~ "Andalucía",
tabla_aire$`Comunidades y Ciudades Autónomas`== "02 Aragón" ~ "Aragón",
tabla_aire$`Comunidades y Ciudades Autónomas`== "03 Asturias, Principado de" ~ "Asturias, Principado de",
tabla_aire$`Comunidades y Ciudades Autónomas`== "04 Balears, Illes" ~ "Balears, Illes",
tabla_aire$`Comunidades y Ciudades Autónomas`== "05 Canarias" ~ "Canarias",
tabla_aire$`Comunidades y Ciudades Autónomas`== "06 Cantabria" ~ "Cantabria",
tabla_aire$`Comunidades y Ciudades Autónomas`== "07 Castilla y León" ~ "Castilla y León",
tabla_aire$`Comunidades y Ciudades Autónomas`== "08 Castilla - La Mancha" ~ "Castilla - La Mancha",
tabla_aire$`Comunidades y Ciudades Autónomas`== "09 Cataluña" ~ "Cataluña",
tabla_aire$`Comunidades y Ciudades Autónomas`== "10 Comunitat Valenciana" ~ "Comunitat Valenciana",
tabla_aire$`Comunidades y Ciudades Autónomas`== "11 Extremadura" ~ "Extremadura",
tabla_aire$`Comunidades y Ciudades Autónomas`== "12 Galicia" ~ "Galicia",
tabla_aire$`Comunidades y Ciudades Autónomas`== "13 Madrid, Comunidad de" ~ "Madrid, Comunidad de",
tabla_aire$`Comunidades y Ciudades Autónomas`== "14 Murcia, Región de" ~ "Murcia, Región de",
tabla_aire$`Comunidades y Ciudades Autónomas`== "15 Navarra, Comunidad Foral de" ~ "Navarra, Comunidad Foral de",
tabla_aire$`Comunidades y Ciudades Autónomas`== "16 País Vasco" ~ "País Vasco",
tabla_aire$`Comunidades y Ciudades Autónomas`== "17 Rioja, La" ~ "Rioja, La",
tabla_aire$`Comunidades y Ciudades Autónomas`== "18 Ceuta" ~ "Ceuta",
tabla_aire$`Comunidades y Ciudades Autónomas`== "19 Melilla" ~ "Melilla",
))%>%
select(Comunidades_Autonomas, everything())%>%
select(-`Comunidades y Ciudades Autónomas`)
# Ver los resultados de la media
datatable(media_calidad_aire)
Podemos visualizar la evolución de la concentración de particulas en
el aire:
Ahora relacionaremos la tabla anterior con la mortalidad prental.
mortalidad_aire <-
full_join(x = media_calidad_aire, y = mortalidad, by = c("Comunidades_Autonomas", "Año"))
datatable(mortalidad_aire)
Una vez obtenida la tabla con los datos de concentración media de PM y de mortalidad prenatal por año y comunidad autónomas podemos ver si existe alguna relación.
#### Conclusiones:
# Suponiendo que tienes un dataframe 'datos' con las columnas 'Comunidad_Autonoma', 'Año' y 'Ruido'
ggplot(RUIDO_CCAA, aes(x = factor(Año), y = Ruido, fill = Comunidades_Autonomas)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Evolución del Ruido por Comunidad Autónoma",
x = "Año",
y = "Valor de Ruido"
) +
theme_minimal() +
theme(legend.position = "bottom")
ggplot(RUIDO_CCAA, aes(x = Año, y = Ruido, color = Comunidades_Autonomas)) +
geom_point() +
labs(title = "Ruido por Comunidad Autónoma y Año",
x = "Año",
y = "Valor de Ruido") +
theme_minimal() +
theme(legend.position = "bottom")
A continuación haremos lo mismo pero en este caso, uniendo la tabla de mortalidad prenatal junto con la de ruido ambiente.
mortalidad_RUIDO <-
full_join(x = RUIDO_CCAA, y = mortalidad, by = c("Comunidades_Autonomas", "Año"))
datatable(mortalidad_RUIDO)
Representaremos unas gráficas en las que se vea la evolución de la muerte prenatal en función de las dos variables planteadas; Ruido y Media_PM.
# Verificar si hay datos para la comunidad seleccionada
cat("Comunidades autónomas disponibles:\n")
## Comunidades autónomas disponibles:
print(unique(mortalidad_aire$"Comunidades Autonomas")) # Lista las comunidades únicas
## Warning: Unknown or uninitialised column: `Comunidades Autonomas`.
## NULL
# Pedir al usuario que introduzca una comunidad autónoma
comunidad_seleccionada <- readline(prompt = "Introduce la comunidad autónoma que deseas analizar: ")
## Introduce la comunidad autónoma que deseas analizar:
# Filtrar los datos para la comunidad seleccionada
datos_filtrados <- mortalidad_aire %>%
filter("Comunidades Autonomas" == comunidad_seleccionada)
# Filtrar los datos para la comunidad seleccionada
datos_filtrados <- subset(mortalidad_aire, "Comunidades Autonomas" == comunidad_seleccionada)
# Verificar si hay datos para la comunidad seleccionada
if (nrow(datos_filtrados) == 0) {
cat("No hay datos disponibles para la comunidad autónoma seleccionada:", comunidad_seleccionada, "\n")
} else {
# Crear la gráfica
grafica <- ggplot(datos_filtrados, aes(x = año)) +
geom_line(aes(y = media_PM, color = "Media PM2.5"), size = 1) +
geom_line(aes(y = Mortalidad, color = "Mortalidad"), size = 1) +
geom_point(aes(y = Mortalidad, color = "Mortalidad"), size = 2) +
labs(
title = paste("Evolución de Mortalidad y Contaminación en", comunidad_seleccionada),
x = "Año",
y = "Valores",
color = "Indicador"
) +
theme_minimal()
# Mostrar la gráfica
print(grafica)
}
## No hay datos disponibles para la comunidad autónoma seleccionada:
Idea primer objetivo: realizar un mapa en el que se vean los distintos datos usando los siguientes paquetes:
#library(mapSpain)
#library(sf)
#library(dplyr)
#library(ggplot2)